// Copyright (c) 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "base/sys_info.h"
#include "media/gpu/shared_memory_region.h"

namespace media {

SharedMemoryRegion::SharedMemoryRegion(const base::SharedMemoryHandle& handle,
    off_t offset,
    size_t size,
    bool read_only)
    : shm_(handle, read_only)
    , offset_(offset)
    , size_(size)
    , alignment_size_(offset % base::SysInfo::VMAllocationGranularity())
{
    DCHECK_GE(offset_, 0) << "Invalid offset: " << offset_;
}

SharedMemoryRegion::SharedMemoryRegion(const BitstreamBuffer& bitstream_buffer,
    bool read_only)
    : SharedMemoryRegion(bitstream_buffer.handle(),
        bitstream_buffer.offset(),
        bitstream_buffer.size(),
        read_only)
{
}

bool SharedMemoryRegion::Map()
{
    if (offset_ < 0) {
        DVLOG(1) << "Invalid offset: " << offset_;
        return false;
    }
    return shm_.MapAt(offset_ - alignment_size_, size_ + alignment_size_);
}

void* SharedMemoryRegion::memory()
{
    int8_t* addr = reinterpret_cast<int8_t*>(shm_.memory());
    return addr ? addr + alignment_size_ : nullptr;
}

} // namespace media
